/**
 * 通用金额工具 - 分↔元转换与格式化
 * 注意：后端金额单位统一为「分」，前端展示为「元」并保留两位小数。
 */

/**
 * 分转元（数字）
 * @param {number|string} cents 金额（分）
 * @returns {number} 金额（元，数值型）
 */
function centToYuanNumber(cents) {
  const n = typeof cents === 'string' ? parseInt(cents, 10) : cents;
  if (typeof n !== 'number' || isNaN(n)) return 0;
  return n / 100;
}

/**
 * 分转元（字符串，保留两位小数）
 * @param {number|string} cents 金额（分）
 * @param {{withSymbol?: boolean}} options 是否带货币符号
 * @returns {string} 格式化后的金额（如 "123.45" 或 "¥123.45"）
 */
function centToYuan(cents, options = {}) {
  const { withSymbol = false } = options;
  const v = centToYuanNumber(cents);
  const s = (Math.round(v * 100) / 100).toFixed(2);
  return withSymbol ? `\u00A5${s}` : s; // \u00A5 为 "¥"
}

/**
 * 元转分（支持字符串与数字，自动四舍五入）
 * @param {number|string} yuan 金额（元）
 * @returns {number} 金额（分，整数）
 */
function yuanToCent(yuan) {
  if (yuan === null || yuan === undefined) return 0;
  let num = 0;
  if (typeof yuan === 'number') {
    num = yuan;
  } else if (typeof yuan === 'string') {
    const cleaned = yuan.trim().replace(/[^0-9.-]/g, '');
    if (!cleaned || cleaned === '.' || cleaned === '-' || cleaned === '-.') return 0;
    num = parseFloat(cleaned);
  } else {
    return 0;
  }
  if (isNaN(num)) return 0;
  return Math.round(num * 100);
}

/**
 * 将分格式化为显示字符串（可选带符号）
 * @param {number|string} cents 金额（分）
 * @param {boolean} withSymbol 是否带符号
 * @returns {string}
 */
function formatCent(cents, withSymbol = false) {
  return centToYuan(cents, { withSymbol });
}

/**
 * 将元格式化为显示字符串（保留两位小数，可选带符号）
 * @param {number|string} yuan 金额（元）
 * @param {boolean} withSymbol 是否带符号
 * @returns {string}
 */
function formatYuan(yuan, withSymbol = false) {
  const num = typeof yuan === 'number' ? yuan : parseFloat(yuan);
  const s = (isNaN(num) ? 0 : Math.round(num * 100) / 100).toFixed(2);
  return withSymbol ? `\u00A5${s}` : s;
}

module.exports = {
  centToYuanNumber,
  centToYuan,
  yuanToCent,
  formatCent,
  formatYuan,
};